#ifndef PLAYHAND_H
#define PLAYHAND_H

#include "Cards.h"


class PlayHand
{
public:
    // 出牌组合或者方式
    enum HandType{
        Hand_Unknown,               //未知（非法）
        Hand_Pass,                  //过

        Hand_Single,                //单
        Hand_Pair,                  //对

        Hand_Triple,                //三张
        Hand_Triple_Single,         //三带一
        Hand_Triple_Pair,           //三带二

        Hand_Plane,                 //飞机
        Hand_Plane_Two_Single,      //飞机带两个单
        Hand_Plane_Two_Pair,        //飞机带两个对

        Hand_Seq_Pair,              //连对
        Hand_Seq_Single,            //顺子

        Hand_Bomb,                  //炸弹
        Hand_Bomb_Single,           //炸弹带一个
        Hand_Bomb_Pair,             //炸弹带一对
        Hand_Bomb_Two_Single,       //炸弹带两单

        Hand_Bomb_Jokers,           //王炸
        Hand_Bomb_Jokers_Single,    //王炸带一个
        Hand_Bomb_Jokers_Pair,      //王炸带一对
        Hand_Bomb_Jokers_Two_Single //王炸带两单
    };

    PlayHand();

    //传递给类一组牌，通过类分析出牌型，点数，以及相关的拓展信息（比如记录顺子的个数）
    explicit  PlayHand(Cards& cards);
    PlayHand(HandType type, Card::CardPoint pt, int extra);//extra是相关的拓展信息（如记录顺子的个数）

    //向外提供分析后牌的信息
    HandType handType();
    Card::CardPoint cardPoint();
    int extra();

    //比较自己的牌和其他人的牌的牌型大小
    bool canBeat(const PlayHand& other);

private:
    // 1. 对参数的牌进行分类：1张、2张、3张、4张分别多少种
    void classify(Cards& cards);
    // 2. 对牌型进行判定
    void judgeCardType();

    //判断牌的类型
    bool isPass();                              //没有出牌即为跳过
    bool isSingle();                            //单
    bool isPair();                              //双
    bool isTriple();                            //三张
    bool isTripleSingle();                      //三带一
    bool isTriplePair();                        //三带一对
    bool isPlane();                             //飞机
    bool isPlaneTwoSingle();                    //飞机带两单
    bool isPlaneTwoPair();                      //飞机带两对
    bool isSeqPair();                           //连队
    bool isSeqSingle();                         //顺子
    bool isBomb();                              //炸弹
    bool isBombSingle();                        //炸弹带一张
    bool isBombPair();                          //炸弹带一对
    bool isBombTwoSingle();                     //炸弹带两单
    bool isBombJokers();                        //王炸
    bool isBombJokersSingle();                  //王炸带单张
    bool isBombJokersPair();                    //王炸带一对
    bool isBombJokersTwoSingle();               //王炸带两单

private:
    HandType m_type;//牌型
    Card::CardPoint m_pt;//牌的点数
    int m_extra;//拓展信息
    QVector<Card::CardPoint> m_oneCard;//存储单张卡牌的点数
    QVector<Card::CardPoint> m_twoCard;//存储两张卡牌的点数
    QVector<Card::CardPoint> m_threeCard;//存储三张卡牌的点数
    QVector<Card::CardPoint> m_fourCard;//存储炸弹的分别点数


};

#endif // PLAYHAND_H
